//
//  JKBaseModel.h
//  JKBaseModel
//
//  Created by zx_04 on 15/6/27.
//  Copyright (c) 2015年 joker. All rights reserved.
//  github:https://github.com/Joker-King/JKDBModel

#import <Foundation/Foundation.h>

/** SQLite五种数据类型 */
#define SQLTEXT     @"TEXT"
#define SQLINTEGER  @"INTEGER"
#define SQLREAL     @"REAL"
#define SQLBLOB     @"BLOB"
#define SQLNULL     @"NULL"
#define PrimaryKey  @"primary key"
#define primaryId   @"pk"

@interface JKDBModel : NSObject

/** 主键 id */
@property (nonatomic, assign) int pk;
/** 列名 */
@property (retain, readonly, nonatomic) NSMutableArray *columeNames;
/** 列类型 */
@property (retain, readonly, nonatomic) NSMutableArray *columeTypes;

#pragma mark - 表操作

/** 创建表 如果已经创建，返回YES*/
+ (BOOL)createTable;

/** 数据库中是否存在表 */
+ (BOOL)isExistInTable;

/** 表中的字段*/
+ (NSArray *)getColumns;

/** 获取该类的所有属性 */
+ (NSDictionary *)getPropertys;

/** 获取所有属性，包括主键 */
+ (NSDictionary *)getAllProperties;

#pragma mark - 增 、 改

/** 保存单个数据 */
- (BOOL)save;

/** 保存或更新 如果不存在主键，保存，有主键，则更新 */
- (BOOL)saveOrUpdate;

/** 批量保存数据 */
+ (BOOL)saveObjects:(NSArray *)array;

/** 更新单个数据 */
- (BOOL)update;

/** 批量更新数据*/
+ (BOOL)updateObjects:(NSArray *)array;

#pragma mark - 判断是否存在/插入

- (BOOL)isExsitWithObjectByIdentifier:(NSString *)identifier;

/** 通过条件更新单个对象 */
- (BOOL)updateWithIdentifier:(NSString *)identifier;
/** 通过条件批量删除数据 */
+ (BOOL)deleteobjects:(NSArray *)array identifiers:(NSArray *)identifiers;
#pragma mark - 删

/** 清空表 */
+ (BOOL)clearTable;

/** 删除单个数据 */
- (BOOL)deleteObject;

/** 批量删除数据 */
+ (BOOL)deleteObjects:(NSArray *)array;

/** 通过条件删除数据 */
+ (BOOL)deleteObjectsByCriteria:(NSString *)criteria;

/** 通过条件删除 (多参数）--2 */
+ (BOOL)deleteObjectsWithFormat:(NSString *)format, ...;

#pragma mark - 查

/** 查询全部数据 */
+ (NSArray *)findAll;

/** 通过主键查询 */
+ (instancetype)findByPK:(int)inPk;

/** 多参数查询*/
+ (instancetype)findFirstWithFormat:(NSString *)format, ...;

/** 查找某条数据 */
+ (instancetype)findFirstByCriteria:(NSString *)criteria;

/** 多参数查询*/
+ (NSArray *)findWithFormat:(NSString *)format, ...;

/** 通过条件查找数据 分页查询 @" WHERE pk > 5 limit 10"*/
+ (NSArray *)findByCriteria:(NSString *)criteria;

/** 去重查询 ，根据条件*/
+ (NSArray *)duplicateRemovalFindByCriteria:(NSString *)criteria;

#pragma mark - must be override method

/** 如果子类中有一些property不需要创建数据库字段，那么这个方法必须在子类中重写  */
+ (NSArray *)transients;

@end
